home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2MISC / CSDPMI1P.ZIP / SRC / CWSDPMI / CWSPARAM.C next >
Encoding:
C/C++ Source or Header  |  1996-02-03  |  6.4 KB  |  303 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #ifdef GO32
  6. #include <unistd.h>
  7. #else
  8. #include <io.h>
  9. #endif
  10.  
  11. #include "gotypes.h"
  12. #include "control.h"
  13.  
  14. int view_only = 0;
  15. unsigned size_of_stubinfo = 0;
  16. char *client_stub_info;
  17. int f;
  18.  
  19. void find_info(char *filename)
  20. {
  21.   char buffer[30000];
  22.   int i,size;
  23.   
  24.   f = open(filename, O_RDWR | O_BINARY);
  25.   if (f < 0) {
  26.     f = open(filename, O_RDONLY | O_BINARY);
  27.     if (f < 0) {
  28.       perror(filename);
  29.       exit(1);
  30.     }
  31.     if(!view_only) {
  32.       view_only = 1; 
  33.       printf("%s is read only, you can only view:\n",filename);
  34.     }
  35.   }
  36.  
  37.   size = read(f, buffer, sizeof(buffer));
  38.   if(size == sizeof(buffer)) {
  39.     printf("Buffer not large enough to hold %s (%d bytes).\n",filename,size);
  40.     exit(1);
  41.   }
  42.  
  43.   client_stub_info = NULL;
  44.   for(i=0; i<size && !client_stub_info; i++)
  45.     if(buffer[i] == 'C' && !strcmp(buffer+i+1,"WSPBLK")) {
  46.       client_stub_info = (buffer+i);
  47.       size_of_stubinfo = sizeof(CWSDPMI_pblk);
  48.     }
  49.  
  50.   if(!client_stub_info) {
  51.     printf("Parameter block magic not found in %s!\n",filename);
  52.     exit(2);
  53.   }
  54.  
  55.   lseek(f, i-1, SEEK_SET);    /* Ready to update */
  56.   return;
  57. }
  58.  
  59. void store_info(void)
  60. {
  61.   write(f, client_stub_info, size_of_stubinfo);
  62. }
  63.  
  64. char *pose_question(char *question, char *default_answer)
  65. {
  66.   static char response[200];
  67.   printf("%s ? [%s] ", question, default_answer);
  68.   fflush(stdout);
  69.   gets(response);
  70.   if (response[0] == '\0')
  71.     return 0;
  72.   return response;
  73. }
  74.  
  75. typedef void (*PerFunc)(void *address_of_field, char *buffer);
  76.  
  77. void str_v2s(void *addr, char *buf, int len)
  78. {
  79.   if (*(char *)addr == 0)
  80.     strcpy(buf, "\"\"");
  81.   else
  82.   {
  83.     buf[len] = 0;
  84.     strncpy(buf, (char *)addr, len);
  85.   }
  86. }
  87.  
  88. void str_s2v(void *addr, char *buf, int len)
  89. {
  90.   if (strcmp(buf, "\"\"") == 0)
  91.     *(char *)addr = 0;
  92.   else
  93.   {
  94.     ((char *)addr)[len-1] = 0;
  95.     strncpy((char *)addr, buf, len);
  96.   }
  97. }
  98.  
  99. void str_v2s48(void *addr, char *buf)
  100. {
  101.   str_v2s(addr, buf, 48);
  102.   if (strcmp(buf, "\"\"") == 0)
  103.     strcpy(buf,"*Disabled*");
  104. }
  105.  
  106. void str_s2v48(void *addr, char *buf)
  107. {
  108.   str_s2v(addr, buf, 48);
  109. }
  110.  
  111. void num_v2s(void *addr, char *buf)
  112. {
  113.   unsigned v = *(unsigned short *)addr;
  114.   sprintf(buf, "%d", v);
  115. }
  116.  
  117. void num_s2v(void *addr, char *buf)
  118. {
  119.   unsigned r = 0;
  120.   sscanf(buf, "%i", &r);
  121.   *(unsigned short *)addr = r;
  122. }
  123.  
  124. void num_vpt2s(void *addr, char *buf)
  125. {
  126.   unsigned v = *(unsigned short *)addr;
  127.   if(v%256)
  128.     sprintf(buf, "%dKb", v*4);
  129.   else
  130.     sprintf(buf, "%dMb", v/256);
  131. }
  132.  
  133. void num_s2vpt(void *addr, char *buf)
  134. {
  135.   unsigned long r = 0;
  136.   char s = 0;
  137.   sscanf(buf, "%li%c", &r, &s);
  138.   switch (s)
  139.   {
  140.     case 'k':
  141.     case 'K':
  142.       r *= 1024L;
  143.       break;
  144.     case 'm':
  145.     case 'M':
  146.       r *= 1048576L;
  147.       break;
  148.   }
  149.   *(unsigned short *)addr = (r+4095L)/4096L;
  150. }
  151.  
  152. #define Ofs(n) ((int)&(((CWSDPMI_pblk *)0)->n))
  153.  
  154. struct {
  155.   char *short_name;
  156.   char *long_name;
  157.   int offset_of_field;
  158.   PerFunc val2string;
  159.   PerFunc string2val;
  160. } per_field[] = {
  161.   {
  162.     "swapfile",
  163.     "Full name of paging file (\"\" to disable)",
  164.     Ofs(swapname),
  165.     str_v2s48, str_s2v48
  166.   },
  167. /*  {
  168.     "flags",
  169.     "Value of run flags",
  170.     Ofs(flags),
  171.     num_v2s, num_s2v
  172.   },*/
  173.   {
  174.     "pagetable",
  175.     "Number of page tables to initially allocate (0=auto)",
  176.     Ofs(pagedir),
  177.     num_v2s, num_s2v
  178.   },
  179.   {
  180.     "minappmem",
  181.     "Minimum application memory desired before 640K paging",
  182.     Ofs(minapp),
  183.     num_vpt2s, num_s2vpt
  184.   },
  185.   {
  186.     "savepara",
  187.     "Paragraphs of DOS memory to reserve when 640K paging",
  188.     Ofs(savepar),
  189.     num_v2s, num_s2v
  190.   }
  191. };
  192.  
  193. #define NUM_FIELDS (sizeof(per_field) / sizeof(per_field[0]))
  194.  
  195. #define HFORMAT "%-18s %s\n"
  196.  
  197. void give_help(void)
  198. {
  199.   int i;
  200.   fprintf(stderr, "Usage: cwsparam [-v] [-h] [cwsdpmi.exe] [field=value . . . ]\n");
  201.   fprintf(stderr, "-h = give help   -v = view info  field=value means set w/o prompt\n");
  202.   fprintf(stderr, HFORMAT, "-field-", "-description-");
  203.  
  204.   for (i=0; i < NUM_FIELDS; i++)
  205.     fprintf(stderr, HFORMAT, per_field[i].short_name, per_field[i].long_name);
  206.   exit(1);
  207. }
  208.  
  209. int main(int argc, char **argv)
  210. {
  211.   int i;
  212.   int need_to_save;
  213.  
  214.   if (argc > 1 && strcmp(argv[1], "-v") == 0)
  215.   {
  216.     view_only = 1;
  217.     argc--;
  218.     argv++;
  219.   }
  220.  
  221.   if (argc > 1 && strcmp(argv[1], "-h") == 0)
  222.     give_help();
  223.  
  224.   if (argc < 2 || strchr(argv[1],'=') != NULL)
  225.     find_info("cwsdpmi.exe");
  226.   else {
  227.     find_info(argv[1]);
  228.     argc--;
  229.     argv++;
  230.   }
  231.  
  232.   if (view_only)
  233.   {
  234.     char buf[100];
  235.     fprintf(stderr, HFORMAT, "-value-", "-field description-");
  236.     for (i=0; i<NUM_FIELDS; i++)
  237.     {
  238.       if (per_field[i].offset_of_field < size_of_stubinfo)
  239.       {
  240.         per_field[i].val2string(client_stub_info + per_field[i].offset_of_field, buf);
  241.         fprintf(stderr, HFORMAT, buf, per_field[i].long_name);
  242.       }
  243.     }
  244.     exit(0);
  245.   }
  246.  
  247.   if (argc > 1)
  248.   {
  249.     int field, got, got_any = 0;
  250.     char fname[100], fval[100];
  251.     for (i=1; i < argc; i++)
  252.     {
  253.       fname[0] = 0;
  254.       fval[0] = 0;
  255.       sscanf(argv[i], "%[^=]=%s", fname, fval);
  256.       got = 0;
  257.       for (field=0; field<NUM_FIELDS; field++)
  258.       {
  259.         if (strcmp(per_field[field].short_name, fname) == 0)
  260.         {
  261.           got = 1;
  262.           got_any = 1;
  263.           if (per_field[field].offset_of_field < size_of_stubinfo)
  264.           {
  265.             per_field[field].string2val(client_stub_info + per_field[field].offset_of_field, fval);
  266.           }
  267.           else
  268.             fprintf(stderr, "Warning: This image does not support field %s\n", fname);
  269.         }
  270.       }
  271.       if (!got)
  272.       {
  273.         fprintf(stderr, "Error: %s is not a valid field name.\n", fname);
  274.         give_help();
  275.       }
  276.     }
  277.     if (got_any)
  278.       store_info();
  279.     close(f);
  280.     return 0;
  281.   }
  282.  
  283.   need_to_save = 0;
  284.   for (i=0; i<NUM_FIELDS; i++)
  285.   {
  286.     char buf[100], *resp;
  287.     if (per_field[i].offset_of_field < size_of_stubinfo)
  288.     {
  289.       per_field[i].val2string(client_stub_info + per_field[i].offset_of_field, buf);
  290.       if ((resp = pose_question(per_field[i].long_name, buf)) != 0)
  291.       {
  292.         per_field[i].string2val(client_stub_info + per_field[i].offset_of_field, resp);
  293.         need_to_save = 1;
  294.       }
  295.     }
  296.   }
  297.   if (need_to_save)
  298.     store_info();
  299.   close(f);
  300.  
  301.   return 0;
  302. }
  303.